package loader

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"strings"
	_ "github.com/mattn/go-sqlite3" // sqlite driver
	"github.com/sirupsen/logrus"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

// SQLiteLoader 实现 Loader 接口。
type SQLiteLoader struct {
	DB    *gorm.DB
	Table string
}

// 打开数据库文件
func NewSQLiteLoader(path, table string) (*SQLiteLoader, error) {
	db, err := gorm.Open(sqlite.Open(path), &gorm.Config{})
	if err != nil {
		return nil, err
	}
	return &SQLiteLoader{DB: db, Table: table}, nil
}


// 查询指定虚拟系统中所有策略的访问控制列表
func (l *SQLiteLoader) LoadAccessList(id int) ([]string, error) {
	//查询policy表中的access_control字段
	query := fmt.Sprintf("SELECT access_control FROM %s WHERE vsys_id = %d", l.Table, id)
	//返回结果集
	rows, err := l.DB.Raw(query).Rows()
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	var ipList []string
	for rows.Next() {
		var raw sql.NullString
		if err := rows.Scan(&raw); err != nil {
			return nil, err
		}
		// 过滤无效数据(空字符串)
		if !raw.Valid || strings.TrimSpace(raw.String) == "" {
			continue
		}
		// 解析 JSON 数组
		var arr []string
		if err := json.Unmarshal([]byte(raw.String), &arr); err != nil {
			logrus.Error("反序列化accessControl失败:", err)
			continue
		}

		// 静态检查建议：简单复制切片可直接使用 append(ipList, arr...)
		ipList = append(ipList, arr...)

	}

	// 去重并返回
	uniqueIPs := make([]string, 0, len(ipList))
	set := make(map[string]struct{}, len(ipList))
	for _, ip := range ipList {
		if _, ok := set[ip]; !ok {
			set[ip] = struct{}{}
			uniqueIPs = append(uniqueIPs, ip)
		}
	}
	return uniqueIPs, nil
}
